package com.buercorp.wangyu.file;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * 解压
 * 解压流用来读取压缩包里面中的数据
 *
 * @author liyiyu
 */
public class FileTest15 {
    public static void main(String[] args) throws IOException {
        // 1.创建一个File表示要解压的压缩包
        File src = new File("filejava/dest.zip");
        // 2.创建一个File表示解压的目的地
        File dest = new File("destzip");
        // 调用方法
        unzip(src, dest);
    }

    // 定义一个方法来解压
    public static void unzip(File src, File dest) throws IOException {
        // 解压的本质： 把压缩包里面的每一个文件或者文件夹读取出来 按照层级拷贝到目的地中

        // 创建一个解压流用来读取压缩包里面中的数据、
        ZipInputStream zis = new ZipInputStream(new FileInputStream(src));

        // 要获取到压缩包里面的每一个ZipEntry对象

        // 表示当前在压缩包中获取的文件或者文件夹
        ZipEntry entry;
        while ((entry = zis.getNextEntry()) != null) {
            System.out.println(entry);
            if (entry.isDirectory()) {
                // 文件夹 需要在目的地dest处创建一个同样的文件夹
                File file = new File(dest, entry.toString());
                file.mkdirs();
            } else {
                // 文件 需要读取到压缩包中的文件 并把他存放到目的地dest文件中（按照层级目录进行存放）
                FileOutputStream fos = new FileOutputStream(new File(dest, entry.toString()));
                byte[] bytes = new byte[1024];
                int len;
                while ((len = zis.read(bytes)) != -1) {
                    // 写到目的地
                    fos.write(bytes, 0, len);
                }
                fos.close();
                // 表示在压缩包中的一个文件处理完毕
                zis.closeEntry();
            }
        }
        zis.close();
    }


}
